﻿#region Copyright
// Copyright (c) 2011-2012 RaisingForce Team (Alikin Sergey)
//
// Permission is hereby granted, free of charge, to any person
// obtaining a copy of this software and associated documentation
// files (the "Software"), to deal in the Software without
// restriction, including without limitation the rights to use,
// copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the
// Software is furnished to do so, subject to the following
// conditions:
//
// The above copyright notice and this permission notice shall be
// included in all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
// OTHER DEALINGS IN THE SOFTWARE.
#endregion

using System;
using System.Configuration;
using System.Diagnostics.Contracts;
using RaisingForce.RaiseHardwareTest.Hardware;

namespace RaisingForce.RaiseHardwareTest.Configuration
{
    sealed internal class HardwareConfigurationElement :
        ConfigurationElement
    {
        #region Constructors

        public HardwareConfigurationElement()
            : base()
        { }

        public HardwareConfigurationElement(
            string settingsPath,
            string pluginsMask)
        {
            if (settingsPath == null)
            {
                throw new ArgumentNullException("settingsPath");
            }
            if (pluginsMask == null)
            {
                throw new ArgumentNullException("pluginsMask");
            }
            Contract.EndContractBlock();
            this.SettingsPath = settingsPath;
            this.PluginsMask = pluginsMask;
        }

        #endregion

        #region Configuration Properties

        private const string propSettingsPath = "settings";

        [ConfigurationProperty(
            propSettingsPath,
            IsRequired = false,
            DefaultValue = ApplicationHelper.DefaultHardwareSettingsPath)]
        public string SettingsPath
        {
            get { return (string)this[propSettingsPath]; }
            set { this[propSettingsPath] = value; }
        }

        private const string propPluginsMask = "plugins";

        [ConfigurationProperty(
            propPluginsMask,
            IsRequired = false,
            DefaultValue = ApplicationHelper.DefaultHardwarePluginsMask)]
        public string PluginsMask
        {
            get { return (string)this[propPluginsMask]; }
            set { this[propPluginsMask] = value; }
        }

        #endregion

        #region CreateHardwareConfiguration Public Method

        public HardwareConfiguration CreateHardwareConfiguration()
        {
            Contract.Ensures(Contract.Result<HardwareConfiguration>() != null);
            string settingsPath = this.SettingsPath.Trim();
            string pluginsMask = this.PluginsMask.Trim();
            return new HardwareConfiguration(
                settingsPath.Length > 0 ?
                    settingsPath :
                    ApplicationHelper.DefaultHardwareSettingsPath,
                pluginsMask.Length > 0 ?
                    pluginsMask :
                    ApplicationHelper.DefaultHardwarePluginsMask);
        }

        #endregion
    }
}
